Proyectos de Subversion LeadersLinked - SPA

Rev

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

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