Proyectos de Subversion LeadersLinked - SPA

Rev

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

Rev Autor Línea Nro. Línea
3432 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
 
3432 stevensc 11
import EventsList from "components/calendar/EventsList";
12
import EventModal from "components/calendar/EventModal";
5 stevensc 13
 
3432 stevensc 14
import "react-big-calendar/lib/sass/styles.scss";
5 stevensc 15
 
3432 stevensc 16
moment.locale("es");
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
3432 stevensc 37
      .get("/calendar/events")
38
      .then((response) => {
39
        const { data, success } = response.data;
5 stevensc 40
 
725 stevensc 41
        if (!success) {
42
          const errorMessage =
3432 stevensc 43
            typeof data === "string"
725 stevensc 44
              ? data
3432 stevensc 45
              : "Error interno. Por favor, intente más tarde.";
46
          throw new Error(errorMessage);
725 stevensc 47
        }
5 stevensc 48
 
734 stevensc 49
        const formattedEvents = data.map((event) => {
735 stevensc 50
          if (event.allDay) {
51
            return {
52
              ...event,
3432 stevensc 53
              start: new Date(event.start.replace("-", "/")),
54
              end: new Date(event.start.replace("-", "/")),
55
            };
735 stevensc 56
          }
57
 
734 stevensc 58
          return {
59
            ...event,
60
            start: new Date(event.start),
3432 stevensc 61
            end: new Date(event.end),
62
          };
63
        });
734 stevensc 64
 
3432 stevensc 65
        setEvents(formattedEvents);
706 stevensc 66
      })
725 stevensc 67
      .catch((err) => {
3432 stevensc 68
        dispatch(addNotification({ style: "danger", msg: err.message }));
69
      });
70
  }, []);
5 stevensc 71
 
72
  return (
73
    <>
3274 stevensc 74
      <Grid container spacing={1}>
2805 stevensc 75
        <Grid item xs={12} md={8} spacing={3}>
76
          <Calendar
77
            localizer={localizer}
78
            events={events}
3432 stevensc 79
            views={["month", "week", "day"]}
2805 stevensc 80
            popup={false}
81
            defaultDate={new Date()}
3432 stevensc 82
            defaultView="month"
2805 stevensc 83
            selectable
84
            onSelectEvent={selectEvent}
85
            onShowMore={(events) => this.setState({ showModal: true, events })}
86
            messages={{
87
              next: <ArrowForwardIosIcon />,
88
              previous: <ArrowBackIosIcon />,
3432 stevensc 89
              today: "Hoy",
90
              month: "Mes",
91
              week: "Semana",
92
              day: "Día",
93
              allDay: "Todo el día",
94
              date: "Fecha",
95
              time: "Hora",
96
              event: "Evento",
97
              noEventsInRange: "Sin eventos disponibles",
2805 stevensc 98
            }}
99
            eventPropGetter={(event) => {
100
              const backgroundColor = event.backgroundColor
101
                ? event.backgroundColor
3432 stevensc 102
                : "blue";
103
              const color = event.textColor ? event.textColor : "#fff";
104
              return { style: { backgroundColor, color } };
2805 stevensc 105
            }}
106
          />
5 stevensc 107
        </Grid>
2805 stevensc 108
        <Grid item xs={12} md={4}>
109
          <EventsList />
110
        </Grid>
111
      </Grid>
5 stevensc 112
      <EventModal
113
        show={modalShow}
114
        event={selectedEvent}
115
        onClose={unselectEvent}
116
      />
117
    </>
3432 stevensc 118
  );
119
};
5 stevensc 120
 
3432 stevensc 121
export default CalendarPage;