Proyectos de Subversion LeadersLinked - SPA

Rev

Rev 3432 | Ir a la última revisión | | Comparar con el anterior | Ultima modificación | Ver Log |

Rev Autor Línea Nro. Línea
3585 stevensc 1
import React, { useEffect, useState } from 'react';
2
import { axios } from '../../utils';
3
import { useDispatch } from 'react-redux';
4
import { addNotification } from 'store/notification/notification.actions';
5
import { Grid } from '@mui/material';
6
import { Calendar, momentLocalizer } from 'react-big-calendar';
7
import ArrowBackIosIcon from '@mui/icons-material/ArrowBackIos';
8
import ArrowForwardIosIcon from '@mui/icons-material/ArrowForwardIos';
9
import moment from 'moment';
5 stevensc 10
 
3585 stevensc 11
import EventsList from 'components/calendar/EventsList';
12
import EventModal from 'components/calendar/EventModal';
5 stevensc 13
 
3585 stevensc 14
import 'react-big-calendar/lib/css/react-big-calendar.css';
5 stevensc 15
 
3585 stevensc 16
moment.locale('es');
3432 stevensc 17
const localizer = momentLocalizer(moment);
5 stevensc 18
 
19
const CalendarPage = () => {
3432 stevensc 20
  const [events, setEvents] = useState([]);
21
  const [selectedEvent, setSelectedEvent] = useState(null);
22
  const [modalShow, setModalShow] = useState(false);
23
  const dispatch = useDispatch();
5 stevensc 24
 
25
  const selectEvent = (event) => {
3432 stevensc 26
    setSelectedEvent(event);
27
    setModalShow(true);
28
  };
5 stevensc 29
 
30
  const unselectEvent = () => {
3432 stevensc 31
    setSelectedEvent(null);
32
    setModalShow(false);
33
  };
5 stevensc 34
 
35
  useEffect(() => {
725 stevensc 36
    axios
3585 stevensc 37
      .get('/calendar/events')
3432 stevensc 38
      .then((response) => {
39
        const { data, success } = response.data;
5 stevensc 40
 
725 stevensc 41
        if (!success) {
42
          const errorMessage =
3585 stevensc 43
            typeof data === 'string' ? data : 'Error interno. Por favor, intente más tarde.';
3432 stevensc 44
          throw new Error(errorMessage);
725 stevensc 45
        }
5 stevensc 46
 
734 stevensc 47
        const formattedEvents = data.map((event) => {
735 stevensc 48
          if (event.allDay) {
49
            return {
50
              ...event,
3585 stevensc 51
              start: new Date(event.start.replace('-', '/')),
52
              end: new Date(event.start.replace('-', '/'))
3432 stevensc 53
            };
735 stevensc 54
          }
55
 
734 stevensc 56
          return {
57
            ...event,
58
            start: new Date(event.start),
3585 stevensc 59
            end: new Date(event.end)
3432 stevensc 60
          };
61
        });
734 stevensc 62
 
3432 stevensc 63
        setEvents(formattedEvents);
706 stevensc 64
      })
725 stevensc 65
      .catch((err) => {
3585 stevensc 66
        dispatch(addNotification({ style: 'danger', msg: err.message }));
3432 stevensc 67
      });
68
  }, []);
5 stevensc 69
 
70
  return (
71
    <>
3274 stevensc 72
      <Grid container spacing={1}>
2805 stevensc 73
        <Grid item xs={12} md={8} spacing={3}>
74
          <Calendar
75
            localizer={localizer}
76
            events={events}
3585 stevensc 77
            views={['month', 'week', 'day']}
2805 stevensc 78
            popup={false}
79
            defaultDate={new Date()}
3585 stevensc 80
            defaultView='month'
2805 stevensc 81
            selectable
82
            onSelectEvent={selectEvent}
83
            onShowMore={(events) => this.setState({ showModal: true, events })}
84
            messages={{
85
              next: <ArrowForwardIosIcon />,
86
              previous: <ArrowBackIosIcon />,
3585 stevensc 87
              today: 'Hoy',
88
              month: 'Mes',
89
              week: 'Semana',
90
              day: 'Día',
91
              allDay: 'Todo el día',
92
              date: 'Fecha',
93
              time: 'Hora',
94
              event: 'Evento',
95
              noEventsInRange: 'Sin eventos disponibles'
2805 stevensc 96
            }}
97
            eventPropGetter={(event) => {
3585 stevensc 98
              const backgroundColor = event.backgroundColor ? event.backgroundColor : 'blue';
99
              const color = event.textColor ? event.textColor : '#fff';
3432 stevensc 100
              return { style: { backgroundColor, color } };
2805 stevensc 101
            }}
102
          />
5 stevensc 103
        </Grid>
2805 stevensc 104
        <Grid item xs={12} md={4}>
105
          <EventsList />
106
        </Grid>
107
      </Grid>
3585 stevensc 108
      <EventModal show={modalShow} event={selectedEvent} onClose={unselectEvent} />
5 stevensc 109
    </>
3432 stevensc 110
  );
111
};
5 stevensc 112
 
3432 stevensc 113
export default CalendarPage;