Proyectos de Subversion LeadersLinked - SPA

Rev

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