Proyectos de Subversion LeadersLinked - SPA

Rev

Rev 3585 | Rev 3658 | 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 from 'react';
2
import { axios } from '../../utils';
3
import { useDispatch } from 'react-redux';
3657 stevensc 4
import { styled, Typography } from '@mui/material';
3585 stevensc 5
import { addNotification } from '../../redux/notification/notification.actions';
5 stevensc 6
 
3585 stevensc 7
import { useFetch } from '@hooks';
2776 stevensc 8
 
3585 stevensc 9
import WidgetLayout from '../widgets/WidgetLayout';
10
import EmptySection from '../UI/EmptySection';
5 stevensc 11
 
12
const StyledContainer = styled(WidgetLayout)`
13
  padding: 1rem;
14
  ul {
15
    display: flex;
16
    flex-direction: column;
17
    gap: 0.5rem;
709 stevensc 18
    margin-top: 0.5rem;
5 stevensc 19
  }
3432 stevensc 20
`;
5 stevensc 21
 
3657 stevensc 22
const StyledEventContainer = styled('div')(({ theme }) => ({
23
  display: 'flex',
24
  flexDirection: 'column',
25
  cursor: 'pointer',
26
  padding: '0.5rem',
27
  borderRadius: theme.shape.borderRadius
28
}));
709 stevensc 29
 
5 stevensc 30
const EventsList = () => {
3585 stevensc 31
  const { data: eventsAndTasks } = useFetch('/helpers/next-events', []);
3432 stevensc 32
  const dispatch = useDispatch();
5 stevensc 33
 
709 stevensc 34
  const getAdminAuth = (url) => {
5 stevensc 35
    axios
36
      .get(url)
3432 stevensc 37
      .then((response) => {
38
        const { data, success } = response.data;
5 stevensc 39
 
40
        if (!success) {
3585 stevensc 41
          throw new Error('Error interno. Por favor, intente más tarde.');
5 stevensc 42
        }
43
 
3585 stevensc 44
        window.open(data, '_blank');
5 stevensc 45
      })
655 stevensc 46
      .catch((err) => {
3585 stevensc 47
        dispatch(addNotification({ style: 'danger', msg: err.message }));
3432 stevensc 48
      });
49
  };
5 stevensc 50
 
893 stevensc 51
  const formatDate = (date, allDay) => {
3432 stevensc 52
    const dateObj = new Date(date);
736 stevensc 53
 
54
    if (isNaN(dateObj)) {
3432 stevensc 55
      return date;
736 stevensc 56
    }
57
 
3585 stevensc 58
    return new Intl.DateTimeFormat('es', {
59
      dateStyle: 'medium',
60
      timeStyle: allDay ? undefined : 'short',
61
      timeZone: 'UTC',
62
      hour12: allDay ? undefined : true
3432 stevensc 63
    }).format(dateObj);
64
  };
735 stevensc 65
 
5 stevensc 66
  return (
67
    <StyledContainer>
68
      <h2>Eventos y Tareas</h2>
69
 
70
      <ul>
71
        {eventsAndTasks.length ? (
707 stevensc 72
          eventsAndTasks.map(
3585 stevensc 73
            ({ id, allDay, url, title, backgroundColor, start, end, textColor, source }) => {
707 stevensc 74
              return (
75
                <li key={id}>
709 stevensc 76
                  <StyledEventContainer
3657 stevensc 77
                    sx={{
78
                      backgroundColor,
79
                      color: textColor
80
                    }}
710 stevensc 81
                    onClick={() =>
3585 stevensc 82
                      source === 'external' ? window.open(url, '_blank') : getAdminAuth(url)
710 stevensc 83
                    }
5 stevensc 84
                  >
3657 stevensc 85
                    <Typography variant='h4'>
707 stevensc 86
                      <b>Evento: </b>
87
                      {title}
3657 stevensc 88
                    </Typography>
89
                    <Typography variant='h4'>
5 stevensc 90
                      <b>Inicio: </b>
893 stevensc 91
                      {formatDate(start, allDay)}
3657 stevensc 92
                    </Typography>
707 stevensc 93
                    {end && (
3657 stevensc 94
                      <Typography variant='h4'>
5 stevensc 95
                        <b>Fin: </b>
893 stevensc 96
                        {formatDate(end, allDay)}
3657 stevensc 97
                      </Typography>
5 stevensc 98
                    )}
3657 stevensc 99
                    <Typography variant='h4'>
100
                      <b>Tipo: </b>
101
                      {source === 'external' ? 'Externo' : 'Interno'}
102
                    </Typography>
709 stevensc 103
                  </StyledEventContainer>
707 stevensc 104
                </li>
3432 stevensc 105
              );
707 stevensc 106
            }
107
          )
5 stevensc 108
        ) : (
3585 stevensc 109
          <EmptySection message='No hay eventos disponibles' />
5 stevensc 110
        )}
111
      </ul>
112
    </StyledContainer>
3432 stevensc 113
  );
114
};
5 stevensc 115
 
3432 stevensc 116
export default EventsList;